#include "./func/HP_TcpPackServer.h"
#include <iostream>

void ErrorHandler(const char* msg)
{
    std::cerr << "XXX  错误：" << msg << std::endl;
    getchar(); // 等待用户按键
    exit(-1);
    return;
}


int main(int argc, char* const argv[])
{


    // 监听地址和端口
    const LPCTSTR IP_ADDR = "0.0.0.0"; // 监听所有网络接口
    const USHORT PORT = 9022;        // 监听端口

    if (!Create_ThreadPool()) { ErrorHandler("创建线程池组件失败."); }


    // 创建监听器
    TcpServerListener TcpPackSerListener;

    // 使用智能指针创建 TcpPackServer 服务端，并传入监听器
    CTcpPackServerPtr TcpPackSer(&TcpPackSerListener);

    if (!TcpPackSer)
    {
        Destroy_ThreadPool(); // 释放已创建的线程池
        ErrorHandler("创建服务器组件失败.");
    }

    // （可选）配置 TcpPackServer 服务器参数
    TcpPackSer->SetMaxConnectionCount(10000); // 设置最大连接数
    TcpPackSer->SetMaxPackSize(1*1024*1024); // 设置最大包长为 1MB
    //TcpPackSer->SetSocketBufferSize(1024 * 1024); // 通信数据缓冲区大小(10kb)
    // TcpPackSer->SetPackHeaderFlag(0xA); // 设置自定义的包头标志


    // 启动服务器
    if (!TcpPackSer->Start(IP_ADDR, PORT))
    {
        Destroy_ThreadPool(); // 释放已创建的线程池
        ErrorHandler("启动服务器失败.");
    }

    std::cout << "$ 最大连接数: " << TcpPackSer->GetMaxConnectionCount() << std::endl;
    //std::cout << "$ 服务器信息配置：通信数据缓冲区大小:" << TcpPackSer->GetSocketBufferSize() << "字节 = " << TcpPackSer->GetSocketBufferSize() / 1024 << " KB" << std::endl;
    std::cout << "$ 最大包体长度: " << TcpPackSer->GetMaxPackSize() << " 字节 = " << TcpPackSer->GetMaxPackSize() / 1024 / 1024 << "MB" << std::endl;
    //std::cout << "$ 数据包包头标识: 0x" << std::hex << TcpPackSer->GetPackHeaderFlag() << std::dec << std::endl;

    std::cout << "√√√  TcpPack服务端启动成功，按下 Enter 键可停止服务器..." << std::endl << std::endl;
    getchar(); // 等待用户按键结束

    // 5. 停止服务器
    TcpPackSer->Stop();
    g_ThreadPool->Stop();

    // server 对象和 listener 对象是栈对象，在 main 函数结束时会自动销毁，其析构函数会确保所有资源被释放.
    std::cout << ">> √√√  TcpPack服务已经停止运行." << std::endl;

    return 0;
}